์ž‘์„ฑ: 2026-03-04 04:03:38์ˆ˜์ •: 2026-03-04 04:03:38

GitHub Actions๋ฅผ ์ด์šฉํ•œ CI/CD ๊ตฌ์ถ•ํ•˜๊ธฐ: ๋ฐฐํฌ ์ž๋™ํ™”์˜ ๊ธฐ์ดˆ

๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ Pushํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์„œ๋ฒ„์— ๋ฐฐํฌ๊นŒ์ง€ ํ•ด์ค€๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? GitHub Actions๋Š” ์ด ๊ณผ์ •์„ ์ž๋™ํ™”ํ•˜๋Š” CI/CD(์ง€์†์  ํ†ตํ•ฉ/์ง€์†์  ์ œ๊ณต) ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.


1. CI/CD๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

  • CI (Continuous Integration): ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž์˜ ์ฝ”๋“œ๊ฐ€ ์ •๊ธฐ์ ์œผ๋กœ ๋นŒ๋“œ๋˜๊ณ  ์ž๋™ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • CD (Continuous Deployment): ๋นŒ๋“œ๋œ ์ฝ”๋“œ๋ฅผ ์‹ค์ œ ์šด์˜ ์„œ๋ฒ„์— ์ž๋™์œผ๋กœ ๋ฐฐํฌํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

2. GitHub Actions ์‹œ์ž‘ํ•˜๊ธฐ (.github/workflows)

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— .github/workflows/deploy.yml ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

name: Java CI/CD with Gradle
 
on:
  push:
    branches: [ "main" ] # ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ํ‘ธ์‹œ๋  ๋•Œ๋งŒ ์‹คํ–‰
 
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
 
    - name: Set up JDK 21
      uses: actions/setup-java@v3
      with:
        java-version: '21'
        distribution: 'temurin'
 
    - name: Build with Gradle
      run: ./gradlew build
 
    - name: Docker build & push
      run: |
        echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
        docker build -t my-app .
        docker tag my-app ${{ secrets.DOCKER_USERNAME }}/my-app:latest
        docker push ${{ secrets.DOCKER_USERNAME }}/my-app:latest
 
    - name: SSH Remote Commands (Deploy)
      uses: appleboy/[email protected]
      with:
        host: ${{ secrets.SERVER_HOST }}
        username: ${{ secrets.SERVER_USER }}
        key: ${{ secrets.SERVER_KEY }}
        script: |
          docker pull ${{ secrets.DOCKER_USERNAME }}/my-app:latest
          docker stop my-app || true
          docker rm my-app || true
          docker run -d --name my-app -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/my-app:latest

3. ํ•ต์‹ฌ ๊ณผ์ • ์ดํ•ดํ•˜๊ธฐ

  1. Checkout: ํ˜„์žฌ ์ €์žฅ์†Œ์˜ ์ฝ”๋“œ๋ฅผ GitHub Actions ์‹คํ–‰๊ธฐ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  2. Build: ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์—๋Ÿฌ๊ฐ€ ๋‚˜๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๊ฐ€์ง€ ์•Š๊ณ  ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.
  3. Docker Push: ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋ฅผ Docker Hub์™€ ๊ฐ™์€ ์ €์žฅ์†Œ์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  4. Deploy: ์‹ค์ œ ์šด์˜ ์„œ๋ฒ„์— ์ ‘์†ํ•˜์—ฌ ์ƒˆ ์ด๋ฏธ์ง€๋ฅผ ๋‚ด๋ ค๋ฐ›๊ณ  ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

4. ๋น„๋ฐ€ ์ •๋ณด ๊ด€๋ฆฌ (Secrets)

์„œ๋ฒ„์˜ ์ฃผ์†Œ, ๋น„๋ฐ€๋ฒˆํ˜ธ, SSH ํ‚ค ๋“ฑ์€ ์™ธ๋ถ€์— ๊ณต๊ฐœ๋˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

  • GitHub Repository Settings -> Secrets and variables -> Actions์— ๊ฐ€์„œ ์œ„ ์„ค์ • ํŒŒ์ผ์— ์ ํžŒ ${{ secrets.XXX }} ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์ˆ˜๋™ ๋ฐฐํฌ์˜ ๋ฒˆ๊ฑฐ๋กœ์›€๊ณผ ์‹ค์ˆ˜์—์„œ ๋ฒ—์–ด๋‚˜, ์ฝ”๋“œ ์ž‘์„ฑ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋™ํ™”๋œ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”!